This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.
Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.
library(lme4)
library(ggplot2)
library(plotrix)
library(visreg)
library(stringr)
library(dplyr)
output_data <- data.frame(read.csv("/Users/noa/Workspace/lasso_positions_sampling_results/brlen_only_lasso_final.csv",header = TRUE, na.strings = ""))
print(output_data)
NA
NA
print( output_data[output_data$lasso_test_R.2<0.5,c("n_seq","n_loci","sample_pct","lasso_test_R.2", "lasso_training_R.2", "lasso_training_spearmanr","number_loci_chosen")])
library(e1071)
data_exp = output_data[output_data$brlen_generator=="exponential",]
Error: object 'output_data' not found
linear.mod = lm((output_data$lasso_test_mse)~(as.factor(output_data$brlen_generator)+as.factor(output_data$actucal_training_size)+output_data$mad+output_data$n_loci
+output_data$avg_entropy))
print(summary(linear.mod))
Call:
lm(formula = (output_data$lasso_test_mse) ~ (as.factor(output_data$brlen_generator) +
as.factor(output_data$actucal_training_size) + output_data$mad +
output_data$n_loci + output_data$avg_entropy))
Residuals:
Min 1Q Median 3Q Max
-41834 -4801 -186 3617 535247
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -2.528e+04 5.902e+03 -4.284 2.08e-05 ***
as.factor(output_data$brlen_generator)optimized -5.619e+03 2.037e+03 -2.759 0.00594 **
as.factor(output_data$brlen_generator)uniform -3.639e+03 2.037e+03 -1.787 0.07441 .
as.factor(output_data$actucal_training_size)100 -1.088e+04 2.629e+03 -4.138 3.91e-05 ***
as.factor(output_data$actucal_training_size)200 -1.302e+04 2.629e+03 -4.951 9.14e-07 ***
as.factor(output_data$actucal_training_size)400 -1.359e+04 2.629e+03 -5.168 3.04e-07 ***
as.factor(output_data$actucal_training_size)800 -1.375e+04 2.629e+03 -5.228 2.23e-07 ***
output_data$mad 3.161e+04 1.503e+04 2.103 0.03578 *
output_data$n_loci 8.859e+00 8.843e-01 10.018 < 2e-16 ***
output_data$avg_entropy 2.835e+04 6.560e+03 4.322 1.76e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 22770 on 740 degrees of freedom
Multiple R-squared: 0.1815, Adjusted R-squared: 0.1716
F-statistic: 18.24 on 9 and 740 DF, p-value: < 2.2e-16
plot(output_data$lasso_test_R.2,resid(linear.mod))
abline(0,0)

example_data %>%
ggplot( aes(x=lasso_test_R.2, color=brlen_generator, fill = brlen_generator)) +
geom_histogram( alpha=0.6, position = 'identity',bins=15)
ggplot(example_data, aes(x=as.factor(actucal_training_size),color=brlen_generator, y=lasso_test_R.2))+
geom_point(size=3)+
labs(title="Lasso test set R squared vs. training size",color = "Branch length distribution")+xlab("Training size")+ylab("Lasso test R squared")+
theme(plot.title = element_text(hjust = 0.5))
ggplot(example_data, aes(x=as.factor(actucal_training_size),color=brlen_generator, y=number_loci_chosen ))+
geom_point(size=3)+
labs(title="Number of positions chosen by Lasso vs. training size",color = "Branch length distribution")+xlab("Training size")+ ylab("Number of positions chosen by Lasso")
theme(plot.title = element_text(hjust = 0.5))
#ggplot(output_data, aes(x=brlen_generator, y=output_data$ll_pearson_during_tree_search, fill=as.factor(actucal_training_size))) +
# geom_boxplot()
#data_exp = output_data[output_data$brlen_generator=="exponential",]
#data_optimized = output_data[output_data$brlen_generator=="optimized",]
#data_uniform = output_data[output_data$brlen_generator=="uniform",]
#ggplot(data_exp, aes(x=as.factor(actucal_training_size), y=ll_pearson_during_tree_search))+
# geom_boxplot()
#ggplot(data_optimized, aes(x=as.factor(actucal_training_size), y=ll_pearson_during_tree_search))+
# geom_boxplot()
#ggplot(data_uniform, aes(x=as.factor(actucal_training_size), y=ll_pearson_during_tree_search))+
# geom_boxplot()
ggplot(output_data, aes(x=as.factor(actucal_training_size), y=ll_pearson_during_tree_search**2, shape=brlen_generator, color=brlen_generator)) +
geom_point(size=3)+labs(title="Pearson R^2 during tree search vs training size")+xlab("training size")+
theme(plot.title = element_text(hjust = 0.5))
ggplot(output_data, aes(x=as.factor(actucal_training_size), y=ll_spearman_during_tree_search**2, shape=brlen_generator, color=brlen_generator)) +
geom_point(size=3)+labs(title="Spearman R^2 during tree search vs training size")+xlab("training size")+
theme(plot.title = element_text(hjust = 0.5))
#ggplot(data_exp, aes(x=as.factor(actucal_training_size), y=ll_pearson_during_tree_search)) +
# geom_point(size=3)+labs(title="Pearson during tree search vs training size- exponential")+xlab("training size")+
# theme(plot.title = element_text(hjust = 0.5))
#ggplot(data_optimized, aes(x=as.factor(actucal_training_size), y=lasso_test_R.2)) +
# geom_point(size=3)+labs(title=title)+xlab(x.axis.name)
#ggplot(data_uniform, aes(x=as.factor(actucal_training_size), y=lasso_test_R.2)) +
# geom_point(size=3)+labs(title=title)+xlab(x.axis.name)
Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.
When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).
The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgpgYGB7cn0KbGlicmFyeShsbWU0KQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGxvdHJpeCkKbGlicmFyeSh2aXNyZWcpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShkcGx5cikKb3V0cHV0X2RhdGEgPC0gZGF0YS5mcmFtZShyZWFkLmNzdigiL1VzZXJzL25vYS9Xb3Jrc3BhY2UvbGFzc29fcG9zaXRpb25zX3NhbXBsaW5nX3Jlc3VsdHMvYnJsZW5fb25seV9sYXNzb19maW5hbC5jc3YiLGhlYWRlciA9IFRSVUUsIG5hLnN0cmluZ3MgPSAiIikpCnByaW50KG91dHB1dF9kYXRhKQoKCmBgYApgYGB7cn0KcHJpbnQoIG91dHB1dF9kYXRhW291dHB1dF9kYXRhJGxhc3NvX3Rlc3RfUi4yPDAuNSxjKCJuX3NlcSIsIm5fbG9jaSIsInNhbXBsZV9wY3QiLCJsYXNzb190ZXN0X1IuMiIsICJsYXNzb190cmFpbmluZ19SLjIiLCAibGFzc29fdHJhaW5pbmdfc3BlYXJtYW5yIiwibnVtYmVyX2xvY2lfY2hvc2VuIildKQpgYGAKCgpgYGB7cn0KCmxpYnJhcnkoZTEwNzEpCgpkYXRhX2V4cCA9IG91dHB1dF9kYXRhW291dHB1dF9kYXRhJGJybGVuX2dlbmVyYXRvcj09ImV4cG9uZW50aWFsIixdCmRhdGFfb3B0aW1pemVkID0gb3V0cHV0X2RhdGFbb3V0cHV0X2RhdGEkYnJsZW5fZ2VuZXJhdG9yPT0ib3B0aW1pemVkIixdCmRhdGFfdW5pZm9ybSA9IG91dHB1dF9kYXRhW291dHB1dF9kYXRhJGJybGVuX2dlbmVyYXRvcj09InVuaWZvcm0iLF0KZGF0YV84MDAgPSBvdXRwdXRfZGF0YVtvdXRwdXRfZGF0YSRhY3R1Y2FsX3RyYWluaW5nX3NpemUgPT04MDAsXQoKUS4yNTwtIGZ1bmN0aW9uKHZlYykKewogIHJldHVybih1bm5hbWUocXVhbnRpbGUodmVjLHByb2JzPTAuMjUpKSkKfQoKZXhhbXBsZV9kYXRhICA9IG91dHB1dF9kYXRhW291dHB1dF9kYXRhJGRhdGFzZXRfaWQ9PSIvZ3JvdXBzL3B1cGtvL25vYWVrZXIvZGF0YS9BQkNfRFIvU2VsZWN0b21lL0V1dGVsZW9zdG9taS9FTlNHVDAwNjAwMDAwMDg0NDgxL3JlZl9tc2EuYWEucGh5IixdCgoKb3V0cHV0X2RhdGEgJT4lIApncm91cF9ieShhY3R1Y2FsX3RyYWluaW5nX3NpemUsYnJsZW5fZ2VuZXJhdG9yICkgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyguY29scz1jKGxhc3NvX3Rlc3RfUi4yLGxhc3NvX3Rlc3Rfc3BlYXJtYW5yLG51bWJlcl9sb2NpX2Nob3NlbiksIC5mbnM9IGxpc3QoTWVkaWFuPW1lZGlhbixNZWFuPW1lYW4sTWluPW1pbixNYXg9bWF4LFNrdz1za2V3bmVzcyksIG5hLnJtPSBUUlVFKSkKCm91dHB1dF9kYXRhICU+JSAKZ3JvdXBfYnkoYnJsZW5fZ2VuZXJhdG9yICkgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyguY29scz1jKGxhc3NvX3Rlc3RfUi4yLGxhc3NvX3Rlc3Rfc3BlYXJtYW5yLG51bWJlcl9sb2NpX2Nob3NlbiksIC5mbnM9IGxpc3QoTWVkaWFuPW1lZGlhbixNZWFuPW1lYW4sTWluPW1pbixNYXg9bWF4KSwgbmEucm09IFRSVUUpKQoKCm91dHB1dF9kYXRhX25vX291dGxpZXJzID0gb3V0cHV0X2RhdGFbb3V0cHV0X2RhdGEkbGFzc29fdGVzdF9SLjI+MC41LF0KCiBnZ3Bsb3Qob3V0cHV0X2RhdGFfbm9fb3V0bGllcnMsIGFlcyh4PWFzLmZhY3RvcihhY3R1Y2FsX3RyYWluaW5nX3NpemUpLGNvbG9yPWJybGVuX2dlbmVyYXRvciwgeT1sYXNzb190ZXN0X1IuMikpKyAKICAgICBnZW9tX2JveHBsb3QoKSsKICAgIGxhYnModGl0bGU9Ikxhc3NvIHRlc3Qgc2V0IHBlYXJzb24gUiBzcXVhcmVkIHZzLiB0cmFpbmluZyBzaXplIikreGxhYigiVHJhaW5pbmcgc2l6ZSIpK3lsYWIoIkxhc3NvIHRlc3QgUiBzcXVhcmVkIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgbGFicyhjb2xvciA9ICJCcmFuY2ggbGVuZ3RoIGRpc3RyaWJ1dGlvbiIpCiAKIAogIGdncGxvdChkYXRhXzgwMCwgYWVzKHg9YXMuZmFjdG9yKGFjdHVjYWxfdHJhaW5pbmdfc2l6ZSksY29sb3I9YnJsZW5fZ2VuZXJhdG9yLCB5PWxhc3NvX3Rlc3RfUi4yKSkrIAogICAgIGdlb21fYm94cGxvdCgpKwogICAgbGFicyh0aXRsZT0iTGFzc28gdGVzdCBzZXQgcGVhcnNvbiBSIHNxdWFyZWQgZm9yIHRyYWluaW5nIHNpemUgODAwIikreGxhYigiVHJhaW5pbmcgc2l6ZSIpKyB5bGFiKCJMYXNzbyB0ZXN0IFIgc3F1YXJlZCIpKyBsYWJzKGNvbG9yID0gIkJyYW5jaCBsZW5ndGggZGlzdHJpYnV0aW9uIikKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgCiAgCiAgICBnZ3Bsb3QoZGF0YV84MDAsIGFlcyh4PWFzLmZhY3RvcihhY3R1Y2FsX3RyYWluaW5nX3NpemUpLGNvbG9yPWJybGVuX2dlbmVyYXRvciwgeT1udW1iZXJfbG9jaV9jaG9zZW4pKSsgCiAgICAgZ2VvbV9ib3hwbG90KCkrCiAgICBsYWJzKHRpdGxlPSJOdW1iZXIgb2YgcG9zaXRpb25zIGNob3NlbiBieSBMYXNzbyBmb3IgdHJhaW5pbmcgc2l6ZSA4MDAiKSt4bGFiKCJUcmFpbmluZyBzaXplIikrIHlsYWIoIk51bWJlciBvZiBwb3NpdGlvbnMgY2hvc2VuIGJ5IExhc3NvIikrIGxhYnMoY29sb3IgPSAiQnJhbmNoIGxlbmd0aCBkaXN0cmlidXRpb24iKQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSAKIAogIAogCgogIAoKIGdncGxvdChvdXRwdXRfZGF0YSwgYWVzKHg9YXMuZmFjdG9yKGFjdHVjYWxfdHJhaW5pbmdfc2l6ZSksY29sb3I9YnJsZW5fZ2VuZXJhdG9yLCB5PWxhc3NvX3Rlc3Rfc3BlYXJtYW5yKioyKSkrCiAgICAgZ2VvbV9ib3hwbG90KCkrCiAgIGxhYnModGl0bGU9Ikxhc3NvIHRlc3Qgc2V0IHNwZWFybWFuIFIgc3F1YXJlZCB2cy4gdHJhaW5pbmcgc2l6ZSIpK3hsYWIoIlRyYWluaW5nIHNpemUiKSsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgbGFicyhjb2xvciA9ICJCcmFuY2ggbGVuZ3RoIGRpc3RyaWJ1dGlvbiIpCgpnZ3Bsb3Qob3V0cHV0X2RhdGEsIGFlcyh4PWFzLmZhY3RvcihhY3R1Y2FsX3RyYWluaW5nX3NpemUpLGNvbG9yPWJybGVuX2dlbmVyYXRvciwgeT1udW1iZXJfbG9jaV9jaG9zZW4gKSkrCiAgICBnZW9tX2JveHBsb3QoKSsKICAgbGFicyh0aXRsZT0iTnVtYmVyIG9mIHBvc2l0aW9ucyBjaG9zZW4gYnkgTGFzc28gdnMuIHRyYWluaW5nIHNpemUiKSt4bGFiKCJUcmFpbmluZyBzaXplIikrIHlsYWIoIk51bWJlciBvZiBwb3NpdGlvbnMgY2hvc2VuIGJ5IExhc3NvIikKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBsYWJzKGNvbG9yID0gIkJyYW5jaCBsZW5ndGggZGlzdHJpYnV0aW9uIikKCgoKCgoKCgoKCgoKCgoKCmBgYAoKYGBge3J9CmxpbmVhci5tb2QgPSBsbSgob3V0cHV0X2RhdGEkbGFzc29fdGVzdF9tc2Upfihhcy5mYWN0b3Iob3V0cHV0X2RhdGEkYnJsZW5fZ2VuZXJhdG9yKSthcy5mYWN0b3Iob3V0cHV0X2RhdGEkYWN0dWNhbF90cmFpbmluZ19zaXplKStvdXRwdXRfZGF0YSRtYWQrb3V0cHV0X2RhdGEkbl9sb2NpCiAgICAgICAgICAgICAgICArb3V0cHV0X2RhdGEkYXZnX2VudHJvcHkpKQpwcmludChzdW1tYXJ5KGxpbmVhci5tb2QpKQpwbG90KG91dHB1dF9kYXRhJGxhc3NvX3Rlc3RfUi4yLHJlc2lkKGxpbmVhci5tb2QpKQphYmxpbmUoMCwwKQpgYGAKCgpgYGB7cn0KZXhhbXBsZV9kYXRhICU+JQogIGdncGxvdCggYWVzKHg9bGFzc29fdGVzdF9SLjIsIGNvbG9yPWJybGVuX2dlbmVyYXRvciwgZmlsbCA9IGJybGVuX2dlbmVyYXRvcikpICsKICAgIGdlb21faGlzdG9ncmFtKCBhbHBoYT0wLjYsIHBvc2l0aW9uID0gJ2lkZW50aXR5JyxiaW5zPTE1KSAKCgogZ2dwbG90KGV4YW1wbGVfZGF0YSwgYWVzKHg9YXMuZmFjdG9yKGFjdHVjYWxfdHJhaW5pbmdfc2l6ZSksY29sb3I9YnJsZW5fZ2VuZXJhdG9yLCB5PWxhc3NvX3Rlc3RfUi4yKSkrIAogICAgIGdlb21fcG9pbnQoc2l6ZT0zKSsKICAgIGxhYnModGl0bGU9Ikxhc3NvIHRlc3Qgc2V0IFIgc3F1YXJlZCB2cy4gdHJhaW5pbmcgc2l6ZSIsY29sb3IgPSAiQnJhbmNoIGxlbmd0aCBkaXN0cmlidXRpb24iKSt4bGFiKCJUcmFpbmluZyBzaXplIikreWxhYigiTGFzc28gdGVzdCBSIHNxdWFyZWQiKSsKCnRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSAKIAoKZ2dwbG90KGV4YW1wbGVfZGF0YSwgYWVzKHg9YXMuZmFjdG9yKGFjdHVjYWxfdHJhaW5pbmdfc2l6ZSksY29sb3I9YnJsZW5fZ2VuZXJhdG9yLCB5PW51bWJlcl9sb2NpX2Nob3NlbiApKSsKICAgIGdlb21fcG9pbnQoc2l6ZT0zKSsKICAgbGFicyh0aXRsZT0iTnVtYmVyIG9mIHBvc2l0aW9ucyBjaG9zZW4gYnkgTGFzc28gdnMuIHRyYWluaW5nIHNpemUiLGNvbG9yID0gIkJyYW5jaCBsZW5ndGggZGlzdHJpYnV0aW9uIikreGxhYigiVHJhaW5pbmcgc2l6ZSIpKyB5bGFiKCJOdW1iZXIgb2YgcG9zaXRpb25zIGNob3NlbiBieSBMYXNzbyIpCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpIAogIApgYGAKCgpgYGB7cn0KI2dncGxvdChvdXRwdXRfZGF0YSwgYWVzKHg9YnJsZW5fZ2VuZXJhdG9yLCB5PW91dHB1dF9kYXRhJGxsX3BlYXJzb25fZHVyaW5nX3RyZWVfc2VhcmNoLCBmaWxsPWFzLmZhY3RvcihhY3R1Y2FsX3RyYWluaW5nX3NpemUpKSkgKyAKIyAgICBnZW9tX2JveHBsb3QoKQoKI2RhdGFfZXhwID0gb3V0cHV0X2RhdGFbb3V0cHV0X2RhdGEkYnJsZW5fZ2VuZXJhdG9yPT0iZXhwb25lbnRpYWwiLF0KI2RhdGFfb3B0aW1pemVkID0gb3V0cHV0X2RhdGFbb3V0cHV0X2RhdGEkYnJsZW5fZ2VuZXJhdG9yPT0ib3B0aW1pemVkIixdCiNkYXRhX3VuaWZvcm0gPSBvdXRwdXRfZGF0YVtvdXRwdXRfZGF0YSRicmxlbl9nZW5lcmF0b3I9PSJ1bmlmb3JtIixdCgojZ2dwbG90KGRhdGFfZXhwLCBhZXMoeD1hcy5mYWN0b3IoYWN0dWNhbF90cmFpbmluZ19zaXplKSwgeT1sbF9wZWFyc29uX2R1cmluZ190cmVlX3NlYXJjaCkpKyAKIyAgICBnZW9tX2JveHBsb3QoKQoKCiNnZ3Bsb3QoZGF0YV9vcHRpbWl6ZWQsIGFlcyh4PWFzLmZhY3RvcihhY3R1Y2FsX3RyYWluaW5nX3NpemUpLCB5PWxsX3BlYXJzb25fZHVyaW5nX3RyZWVfc2VhcmNoKSkrIAogIyAgIGdlb21fYm94cGxvdCgpCgoKI2dncGxvdChkYXRhX3VuaWZvcm0sIGFlcyh4PWFzLmZhY3RvcihhY3R1Y2FsX3RyYWluaW5nX3NpemUpLCB5PWxsX3BlYXJzb25fZHVyaW5nX3RyZWVfc2VhcmNoKSkrIAojICAgIGdlb21fYm94cGxvdCgpCgpnZ3Bsb3Qob3V0cHV0X2RhdGEsIGFlcyh4PWFzLmZhY3RvcihhY3R1Y2FsX3RyYWluaW5nX3NpemUpLCB5PWxsX3BlYXJzb25fZHVyaW5nX3RyZWVfc2VhcmNoKioyLCBzaGFwZT1icmxlbl9nZW5lcmF0b3IsIGNvbG9yPWJybGVuX2dlbmVyYXRvcikpICsKICBnZW9tX3BvaW50KHNpemU9MykrbGFicyh0aXRsZT0iUGVhcnNvbiBSXjIgZHVyaW5nIHRyZWUgc2VhcmNoIHZzIHRyYWluaW5nIHNpemUiKSt4bGFiKCJ0cmFpbmluZyBzaXplIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgoKZ2dwbG90KG91dHB1dF9kYXRhLCBhZXMoeD1hcy5mYWN0b3IoYWN0dWNhbF90cmFpbmluZ19zaXplKSwgeT1sbF9zcGVhcm1hbl9kdXJpbmdfdHJlZV9zZWFyY2gqKjIsIHNoYXBlPWJybGVuX2dlbmVyYXRvciwgY29sb3I9YnJsZW5fZ2VuZXJhdG9yKSkgKwogIGdlb21fcG9pbnQoc2l6ZT0zKStsYWJzKHRpdGxlPSJTcGVhcm1hbiBSXjIgZHVyaW5nIHRyZWUgc2VhcmNoIHZzIHRyYWluaW5nIHNpemUiKSt4bGFiKCJ0cmFpbmluZyBzaXplIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgojZ2dwbG90KGRhdGFfZXhwLCBhZXMoeD1hcy5mYWN0b3IoYWN0dWNhbF90cmFpbmluZ19zaXplKSwgeT1sbF9wZWFyc29uX2R1cmluZ190cmVlX3NlYXJjaCkpICsKIyAgZ2VvbV9wb2ludChzaXplPTMpK2xhYnModGl0bGU9IlBlYXJzb24gZHVyaW5nIHRyZWUgc2VhcmNoIHZzIHRyYWluaW5nIHNpemUtIGV4cG9uZW50aWFsIikreGxhYigidHJhaW5pbmcgc2l6ZSIpKwojICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKI2dncGxvdChkYXRhX29wdGltaXplZCwgYWVzKHg9YXMuZmFjdG9yKGFjdHVjYWxfdHJhaW5pbmdfc2l6ZSksIHk9bGFzc29fdGVzdF9SLjIpKSArCiMgIGdlb21fcG9pbnQoc2l6ZT0zKStsYWJzKHRpdGxlPXRpdGxlKSt4bGFiKHguYXhpcy5uYW1lKQojZ2dwbG90KGRhdGFfdW5pZm9ybSwgYWVzKHg9YXMuZmFjdG9yKGFjdHVjYWxfdHJhaW5pbmdfc2l6ZSksIHk9bGFzc29fdGVzdF9SLjIpKSArCiMgIGdlb21fcG9pbnQoc2l6ZT0zKStsYWJzKHRpdGxlPXRpdGxlKSt4bGFiKHguYXhpcy5uYW1lKQoKYGBgCgoKCgoKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkNtZCtPcHRpb24rSSouCgpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkNtZCtTaGlmdCtLKiB0byBwcmV2aWV3IHRoZSBIVE1MIGZpbGUpLiAKClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4KCg==